package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKFacturasPorCobrar;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedor;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.Letra;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;

@Named(value = "MBFacturasCobrar")
@Scope("request")
public class MBFacturasCobrar extends MBGenerico implements IMantenedor,IObserver, Serializable{
 
	private static final long serialVersionUID = -4145631299815443339L;
	
	private static Logger logger = Logger.getLogger(MBFacturasCobrar.class);

	@Inject
	private BKFacturasPorCobrar bkFacturasPorCobrar;
	
	@Inject
	private IServicioTipoMoneda servicioTipoMoneda;
	
	@Inject
	private IServicioCliente servicioCliente;
	
	@Inject
	private MBComponenteFindCliente mbComponenteFindCliente;
	
	@Inject
	private IServicioVentaFacturacion servicioVentaFacturacion;
	
	@Override
	public void actualizarObservador(Object object) {
        if (object instanceof Cliente) {
            try {
                Cliente cliente = servicioCliente.conseguirClientePorId(((Cliente) object).getId());
                bkFacturasPorCobrar.setClienteSeleccionado(cliente);
            } catch (ServiceException e) {
                e.printStackTrace();
            }
        }
	}
	
	
	public String mostrar(){
		try{
			logger.info("Inicializando Facturas por cobrar");
			mbComponenteFindCliente.addObserver(this);
			this.bkFacturasPorCobrar.setClienteSeleccionado(new Cliente());
			this.bkFacturasPorCobrar.setTipoMonedaSeleccionado(new TipoMoneda(0));
			List<SelectItem> comboTipoMonedasBusqueda = new ArrayList<SelectItem>();
			Collection<TipoMoneda> collectionTipoMoneda = servicioTipoMoneda.listarTipoMonedasActivos();
			comboTipoMonedasBusqueda.add(new SelectItem(0,"TODOS"));
			for (TipoMoneda tipoMoneda : collectionTipoMoneda) {
				comboTipoMonedasBusqueda.add(new SelectItem(tipoMoneda.getId(),tipoMoneda.getNombre()));
			}
			this.bkFacturasPorCobrar.setComboTipoMonedasBusqueda(comboTipoMonedasBusqueda);
			this.bkFacturasPorCobrar.setListaFacturasPorCobrar(new ArrayList<VentaFacturacion>());
			this.bkFacturasPorCobrar.setFechaCancelacion(new Date());
		}catch(Exception e){
			mostrarError(e.getMessage());
		}	
		return URLPaginacion.FacturaPorCobrar.URL_FACTURA_POR_COBRAR;
	}
	
	public void buscar(){
		System.out.println("Buscar");
		VentaFacturacion ventaFacturacion = new VentaFacturacion();
		try {
			if(bkFacturasPorCobrar.getTipoMonedaSeleccionado().getId()!=0){
				ventaFacturacion.setMoneda(bkFacturasPorCobrar.getTipoMonedaSeleccionado());
			}
			if(bkFacturasPorCobrar.getClienteSeleccionado()!=null && bkFacturasPorCobrar.getClienteSeleccionado().getCodigoCliente() !=null && !bkFacturasPorCobrar.getClienteSeleccionado().getCodigoCliente().isEmpty()){
				ventaFacturacion.setCodCliente(bkFacturasPorCobrar.getClienteSeleccionado());
			}
			ventaFacturacion.setNumFactura(bkFacturasPorCobrar.getNumeroFactura());
			bkFacturasPorCobrar.setListaFacturasPorCobrar(new ArrayList<VentaFacturacion>(servicioVentaFacturacion.obtenerVentaFacturacion(ventaFacturacion)));
		} catch (Exception e) {
			mostrarError(e.getMessage());
		}
	}

	public void cancelacion(VentaFacturacion ventaFacturacionSeleccionado){
		try{
			if(this.bkFacturasPorCobrar.getFechaCancelacion()!=null){
				logger.info("cancelacion factura por cobrar: " + ventaFacturacionSeleccionado.getCoddocventa());
				ventaFacturacionSeleccionado.setFecCancelacion(this.bkFacturasPorCobrar.getFechaCancelacion());
				servicioVentaFacturacion.cancelarFactura(ventaFacturacionSeleccionado);
				mostrarMensaje("Se registro la cancelacion de la factura: " + ventaFacturacionSeleccionado.getNumFactura());
				getRequestContext().addCallbackParam("bandGrabarCancelacion", true);
				String[]update = {"formBusquedaFacturaCobrar:pnlListarFacturasCobrar",":msgs"};
				updateComponente(update);
			}else{
				logger.info("error de validacion");
				mostrarWarning("Seleccione una fecha de cancelacion");
				getRequestContext().addCallbackParam("bandGrabarCancelacion", false);
				String[]update = {"formBusquedaFacturaCobrar:msjPopupCancelacionFC"};
				updateComponente(update);
			}	
			this.bkFacturasPorCobrar.setFechaCancelacion(new Date());
		}catch(Exception e){
			mostrarError(e.getMessage());
		}	
	}
	
	public void limpiar(){
		logger.info("limpiando...");
		this.bkFacturasPorCobrar.getClienteSeleccionado().setId(null);
		this.bkFacturasPorCobrar.getClienteSeleccionado().setRazonSocial("");
		this.bkFacturasPorCobrar.getTipoMonedaSeleccionado().setId(0);
		this.bkFacturasPorCobrar.setNumeroFactura("");
	}
	
	@Override
	public String actualizar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String guardar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void eliminar(ActionEvent actionEvent) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public String editar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String nuevo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String ver() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String aceptar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String retroceder() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String cancelar() {
		// TODO Auto-generated method stub
		return null;
	}

}
